<?php
/**
 * 图像处理类
 */
class Img {
      public function __construct() {
            
      }
      /**
       * 水印处理函数
       * @param type $img原图
       * @param type $outImg 另存为…… 
       * @param type $pos 水印位置
       */
      public function water($img, $outImg = null, $pos = null) {
            if (!$this->checkImg($img)) {//判断是不是一个图片
                  return FALSE;
            }
            //******************************打开原图并获得原图资源********************************/
            $imgInfo = getimagesize($img); //获得原图信息
            $imgW = $imgInfo[0]; //获得原图宽度
            $imgH = $imgInfo[1];
            switch ($imgInfo[2]) {//$waterImgInfo[2]值为图片扩展名
                  case 1:
                        $res_img = imagecreatefromgif($img);
                        break;
                  case 2:
                        $res_img = imagecreatefromjpeg($img);
                        break;
                  case 3:
                        $res_img = imagecreatefrompng($img);
                        break;
            }
            //******************************判断并打开水印，并获得水印图片或文字信息（宽、高）************************/
            $waterImg = C('WATER_IMG'); //水印图片            
            $waterImgOn = $this->checkImg($waterImg); //验证水印图片
            $waterImgInfo = getimagesize($waterImg); //获得水印图片信息
            //如果是水印图片则打开
            if ($waterImgOn) {
                  switch ($waterImgInfo[2]) {//$waterImgInfo[2]值为图片扩展名
                        case 1:
                              $w_img = imagecreatefromgif($waterImg);
                              break;
                        case 2:
                              $w_img = imagecreatefromjpeg($waterImg);
                              break;
                        case 3:
                              $w_img = imagecreatefrompng($waterImg);
                              break;
                  }
            }
            //////////////如$waterImgOn成立，获得水印图片宽高            
            $waterImgW = $waterImgInfo[0];
            $waterImgH = $waterImgInfo[1];
            //////////////如$waterImgOn不成立，获得水印文字信息及宽高
            $textInfo = imagettfbbox(C('WATER_TEXT_SIZE'), 0, C('WATER_FONTFILE'), C('WATER_TEXT')); //获得文字宽高等
            $textW = $textInfo[2] - $textInfo[6];
            $textH = $textInfo[3] - $textInfo[7];
            //****************************************获得水印位置（包含图片、文字）*******************************/            
            $pos = intval($pos) ? $pos : C('WATER_POS'); //水印位置
            if ($waterImgOn) {                  
                  $x=$y=  20;  //初步定义水印位置（9宫格内）
                  switch ($pos) {//9宫格位置
                        case 1:
                              break;
                        case 2:
                              $x = ($imgW - $waterImgW) / 2;
                              break;
                        case 3:
                              $x = $imgW - $waterImgW - 20;
                              break;
                        case 9:
                              $x = $imgW - $waterImgW - 20;
                              $y = $imgH - $waterImgH - 20;
                              break;
                  }
            } else {
                   $x=20;$y=  35; //初步定义水印位置（9宫格内）
                  switch ($pos) {//9宫格位置
                        case 1:
                              break;
                        case 2:
                              $x = ($imgW - $textW) / 2;
                              break;
                        case 3:
                              $x = $imgW - $textW - 20;
                              break;
                        case 9:
                              $x = $imgW - $textW - 20;
                              $y = $imgH - $textH;
                              break;
                  }
            }
            //******************************** 加上图片水印或者文字水印***************************************/
            if ($waterImgOn) {//使用图片加水印
                  if ($waterImgW > $imgW || $waterImgH > $imgH) {
                        return false;
                  }
                  if ($waterImgInfo[2] == 3) {//$waterImgInfo[2]图片扩展名
                        imagecopy($res_img, $w_img, $x, $y, 0, 0, $waterImgW, $waterImgH); //使用这个函数能够保证png正常显示
                  } else {
                        imagecopymerge($res_img, $w_img, $x, $y, 0, 0, $waterImgW, $waterImgH, C('WATER_PCT')); //最后参数是透明度
                  }
            } else {//使用文字加水印       
                  if ($textW > $imgW || $textH > $imgH) {
                        return false;
                  }
                  $red = hexdec(substr(C('WATER_TEXT_COLOR'), 1, 2));
                  $green = hexdec(substr(C('WATER_TEXT_COLOR'), 3, 2));
                  $blue = hexdec(substr(C('WATER_TEXT_COLOR'), 5, 2));
                  $color = imagecolorallocate($res_img, $red, $green, $blue);
                  imagettftext($res_img, C('WATER_TEXT_SIZE'), 0, $x, $y, $color, C('WATER_FONTFILE'), C('WATER_TEXT'));
            }
            //**************************图片是否另存为……************************/
            $outImg = $outImg ? $outImg : $img;
            //************************显示图片、释放资源**********************************/
            switch ($imgInfo[2]) {
                  case 1:
                        imagegif($res_img, $outImg);
                        break;
                  case 2:
                        imagejpeg($res_img, $outImg);
                        break;
                  case 3:
                        imagepng($res_img, $outImg);
                        break;
            }
            imagedestroy($res_img); //释放原图资源
            if ($waterImgOn)imagedestroy($w_img); //释放水印图片资源
      }

//***************验证图像文件和GD库环境是否开启****************************/
      /**
       * 验证图像文件和GD库环境是否开启
       * @param type $img图像文件
       * @return type
       */
      private function checkImg($img) {
            return is_file($img) && getimagesize($img) && extension_loaded("GD"); //extension_loaded()检测扩展是否开启
      }

      //***********************************缩略图*********************************************/
      public function thumb($img, $outImg = null, $thumbW = null, $thumbH = null) {
            if (!$this->checkImg($img)) {
                  return false;
            }
            $thumbW = intval($thumbW) ? $thumbW : C("THUMB_WIDTH");
            $thumbH = intval($thumbH) ? $thumbH : C("THUMB_HEIGHT");
            $thumb_res = imagecreatetruecolor($thumbW, $thumbH); //创建画布
            $imgInfo = getimagesize($img); //获得图片尺寸信息
            switch ($imgInfo[2]) {
                  case 1:
                        $img_res = imagecreatefromgif($img);
                        break;
                  case 2:
                        $img_res = imagecreatefromjpeg($img);
                        break;
                  case 3:
                        $img_res = imagecreatefrompng($img);
                        break;
            }
            $imgW = $imgInfo[0]; //获得图片宽度
            $imgH = $imgInfo[1]; //获得图片高度         
            //判断裁切哪一个边
            if ($imgW / $thumbW > $imgH / $thumbH) {
                  $imgW = $imgH / $thumbH * $thumbH; //$imgH/$thumbH缩小的比例
            } else {
                  $imgH = $imgW / $thumbW * $thumbW;
            }
            imagecopyresampled($thumb_res, $img_res, 0, 0, 0, 0, $thumbW, $thumbH, $imgW, $imgH); //重新采样拷贝并调整大小
            $ImgPathInfo = pathinfo($img);
            $outImg = $outImg ? $outImg : $ImgPathInfo['filename'] . "_thumb." . $ImgPathInfo['extension'];
            $outImg = $ImgPathInfo['dirname'] . '/' . $outImg;
            switch ($imgInfo[2]) {
                  case 1:
                        imagegif($thumb_res, $outImg);
                        break;
                  case 2:
                        imagejpeg($thumb_res, $outImg);
                        break;
                  case 3:
                        imagepng($thumb_res, $outImg);
                        break;
            }
            imagedestroy($thumb_res);
            imagedestroy($img_res);
      }
}
?>
